最近使用Python + Django,是一个巨复杂的系统,才几天就40多张数据库的表了。因为在Django里面,表都使用类来实现的,所以就要一开始写很多的class,语法都没问题,但是有时候就会出现ImportError Can not import name xxxx
这个问题遇见了两次,稍微有点差别,现在记录一下来。
1.类之间的循环依赖
代码大致是这样的
class Employee(models.Model):
permission = models.ManyToManyField(Permission)
class Permission(models.Model):
dealer = models.ForeiginKey(Dealer)
name = models.CharField(max_length=20)
class Dealer(models.Model):
employees = models.ManyToManyField(Employee)
这样,Employee依赖Permission,Permission依赖Dealer,Dealer又会回到Employee,这样肯定就是错误的了。
2.不同模块之间的
Service.model 模块
from Appointment.models import Appointment
class Order(models.Model):
appointment = models.ForeignKey(Appointment)
在Appointment.models里面
from Service.models import ServiceItem
这样也会引用错误,这个原因找了好长时间。
因为Order在引用Appointment的时候,会回到Service.models 查找Appointment引用的ServiceItem,但是这个时候Order的构建还没有完成,就会导入错误。这个和Python的机制有关系的。
3.解决办法
今天又遇见这问题了,虽然找到了原因,但是不知道怎么去修改,因为毕竟业务逻辑在这,现在有stackoverflow上找到一个答案,真心好用。
也就是使用字符串表示模块,而不进行导入了。
http://stackoverflow.com/questions/4379042/django-circular-model-import-help
class Service(models.Model):
appointment = models.ForeignKey("appointment.Appointment")
参考
http://www.douban.com/group/topic/43938606/
http://www.oschina.net/question/919901_88601
http://www.oschina.net/translate/top-10-mistakes-that-python-programmers-make
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。